package cn.it.xiaohan.note.filter;

import cn.hutool.core.util.StrUtil;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;

/**
 * 请求乱码解决
 *  乱码原因：
 *      服务器默认的解析编码为ISO-8859-1，不支持中文
 *  乱码情况：
 *      POST请求
 *          Tomcat7及以下版本  乱码
 *          Tomcat8及以上版本  乱码
 *
 *      Get请求
 *          Tomcat7及以下版本  乱码
 *          Tomcat8及以上版本  不乱码
 *
 *   解决方案：
 *      Post请求：
 *          无论是什么版本的服务器，都会出现乱码需要通过request.setCharacterEncoding("UTF-8"),设置编码格式。（只针对Post请求有效）
 *      Get请求：
 *          Tomcat8以上的版本，不会出现乱码，不需要处理，处理反而乱码。
 *          Tomcat7及以下版本，乱码  需要单独处理。
 *              new String(request.getParameter("xxx").getBytes("ISO-8859-1","UTF-8"));
 *
 *
 */
@WebFilter("/*") // 过滤所有资源
public class EncodingFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void destroy() {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        // 基于Http请求的
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;

        // Post请求 该方法对get请求无效
        request.setCharacterEncoding("UTF-8");

        // 得到请求的方式
        String method = request.getMethod();

        // 判断是什么请求  GET | Post
        if ("GET".equalsIgnoreCase(method)){
            // 获取tomcat的版本号
            String servletInfo = request.getServletContext().getServerInfo();
            // 截取版本号
            String version = servletInfo.substring(servletInfo.lastIndexOf("/") + 1,servletInfo.indexOf("."));
            // 判断当前按版本号是否是7及以下版本
            if (version != null && Integer.parseInt(version) < 8){
                // 程序能走到此处，说明Tomcat的版本是7及以下版本
                MyWapper myRequest = new MyWapper(request);
                filterChain.doFilter(myRequest,response);
                return;
            }
        }
        filterChain.doFilter(request,response);
    }

    /**
     * 1. 定义一个内部类（类的本质是request对象）
     * 2. 继承HttpServletRequestWrapper包装类
     * 3重写getParameter（）方法
     */
    class MyWapper extends HttpServletRequestWrapper{

        //定义成员变量 HttpServletRequest对象，（提升构造器中request的作用域）
        private HttpServletRequest request;

        /**
         * 带参构造
         * 可以得到需要处理的request对象
         * @param request
         */
        public MyWapper(HttpServletRequest request) {
            super(request);
            this.request=request;
        }

        /**
         * 重写getParameter方法，处理乱码问题
         * @param name
         * @return
         */
        @Override
        public String getParameter(String name) {
            // 获取当前传过来的参数
            String value = request.getParameter(name);
            // 判断传过来的参数是否为空
            if (StrUtil.isBlank(value)){
                return value;
            }
            // 通过new String () 处理乱码问题
            try{
                value = new String(request.getParameter(value).getBytes("ISO-8859-1"), "UTF-8");
            }catch (Exception e){
                e.printStackTrace();
            }
            return value;
        }
    }
}
